//package com.lib.utils;
//
//import android.content.ClipData;
//import android.content.Context;
//import android.graphics.Canvas;
//import android.graphics.Color;
//import android.graphics.Rect;
//import android.os.Handler;
//import android.os.Looper;
//import android.util.DisplayMetrics;
//import android.util.Log;
//import android.util.TypedValue;
//import android.view.DragEvent;
//import android.view.MotionEvent;
//import android.view.View;
//import android.view.ViewGroup;
//
//import androidx.annotation.NonNull;
//import androidx.recyclerview.widget.ItemTouchHelper;
//import androidx.recyclerview.widget.RecyclerView;
//
///**
// * 通用视图拖拽管理类
// * 支持ItemTouchHelper和系统拖拽之间的平滑切换
// */
//public class UniversalDragManager implements View.OnDragListener {
//    private static final String TAG = "UniversalDragManager";
//
//    // 拖拽来源类型
//    public static final int SOURCE_INTERNAL = 0;  // 内部拖拽
//    public static final int SOURCE_EXTERNAL = 1;  // 外部拖拽
//
//    private final ViewGroup mContainer;           // 容器视图
//    private final DragEventListener mListener;    // 事件监听器
//    private final ItemTouchHelper mItemTouchHelper; // ItemTouchHelper
//
//    private View mPlaceholderView;                // 占位符视图
//    private View mCurrentDragView;                // 当前拖拽的视图
//    private int mTargetPosition = -1;             // 目标位置
//    private boolean mIsSystemDragging = false;    // 是否系统拖拽模式
//    private RecyclerView.ViewHolder mCurrentViewHolder; // 当前拖拽的ViewHolder
//
//    public UniversalDragManager(ViewGroup container, DragEventListener listener) {
//        this.mContainer = container;
//        this.mListener = listener;
//
//        // 初始化ItemTouchHelper
//        this.mItemTouchHelper = new ItemTouchHelper(createItemTouchCallback());
//
//        // 只有RecyclerView才能attach
//        if (mContainer instanceof RecyclerView) {
//            this.mItemTouchHelper.attachToRecyclerView((RecyclerView) mContainer);
//        }
//
//        // 设置拖拽监听
//        mContainer.setOnDragListener(this);
//        setupTouchListener();
//
//        Log.d(TAG, "UniversalDragManager initialized for: " + mContainer.getClass().getSimpleName());
//    }
//
//    /**
//     * 创建ItemTouchHelper回调
//     */
//    private ItemTouchHelper.Callback createItemTouchCallback() {
//        return new ItemTouchHelper.SimpleCallback(
//                ItemTouchHelper.UP | ItemTouchHelper.DOWN |
//                        ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, 0) {
//
//            @Override
//            public boolean onMove(@NonNull RecyclerView recyclerView,
//                                  @NonNull RecyclerView.ViewHolder from,
//                                  @NonNull RecyclerView.ViewHolder target) {
//                Log.d(TAG, "ItemTouchHelper onMove: " + from.getAdapterPosition() + " -> " + target.getAdapterPosition());
//                return mListener.onInternalMove(from.getAdapterPosition(), target.getAdapterPosition());
//            }
//
//            @Override
//            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
//                // 禁用滑动删除
//            }
//
//            @Override
//            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
//                super.onSelectedChanged(viewHolder, actionState);
//                if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
//                    if (viewHolder != null) {
//                        mCurrentViewHolder = viewHolder;
//                        viewHolder.itemView.animate().scaleX(1.05f).scaleY(1.05f).setDuration(150).start();
//                        Log.d(TAG, "Drag started for position: " + viewHolder.getAdapterPosition());
//                    } else {
//                        mCurrentViewHolder = null;
//                        Log.d(TAG, "Drag ended");
//                    }
//                }
//            }
//
//            @Override
//            public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//                super.clearView(recyclerView, viewHolder);
//                viewHolder.itemView.animate().scaleX(1.0f).scaleY(1.0f).setDuration(150).start();
//            }
//
//            @Override
//            public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
//                                    @NonNull RecyclerView.ViewHolder viewHolder,
//                                    float dX, float dY, int actionState, boolean isCurrentlyActive) {
//                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
//
//                // 检测是否应该切换到系统拖拽
//                if (isCurrentlyActive && !mIsSystemDragging &&
//                        shouldSwitchToSystemDrag(viewHolder.itemView, dX, dY)) {
//                    Log.d(TAG, "Switching to system drag");
//                    switchToSystemDrag(viewHolder.itemView, viewHolder.getAdapterPosition());
//                }
//            }
//
//            @Override
//            public boolean isLongPressDragEnabled() {
//                return true;
//            }
//
//            @Override
//            public int getDragDirs(@NonNull RecyclerView recyclerView,
//                                   @NonNull RecyclerView.ViewHolder viewHolder) {
//                // 检查是否可以拖拽
//                if (mListener.canStartDrag(viewHolder.itemView, viewHolder.getAdapterPosition())) {
//                    return super.getDragDirs(recyclerView, viewHolder);
//                }
//                return 0;
//            }
//        };
//    }
//
//    /**
//     * 设置触摸监听器
//     */
//    private void setupTouchListener() {
//        mContainer.setOnTouchListener((v, event) -> {
//            if (event.getAction() == MotionEvent.ACTION_DOWN && !mIsSystemDragging) {
//                // 检测长按启动拖拽
//                View child = findChildUnderPoint(event.getX(), event.getY());
//                if (child != null) {
//                    int position = mContainer.indexOfChild(child);
//                    if (mListener.canStartDrag(child, position)) {
//                        v.postDelayed(() -> {
//                            if (!mIsSystemDragging) { // 防止重复触发
//                                startSystemDrag(child, position);
//                            }
//                        }, 500); // 长按500ms
//                    }
//                }
//            }
//            return false;
//        });
//    }
//
//    /**
//     * 切换到系统拖拽
//     */
//    private void switchToSystemDrag(View view, int position) {
//        mIsSystemDragging = true;
//
//        // 短暂延迟后启动系统拖拽
//        new Handler(Looper.getMainLooper()).postDelayed(() -> {
//            if (mIsSystemDragging) {
//                startSystemDrag(view, position);
//            }
//        }, 50);
//    }
//
//    /**
//     * 启动系统拖拽
//     */
//    public void startSystemDrag(View view, int position) {
//        if (!mListener.canStartDrag(view, position) || mIsSystemDragging) {
//            return;
//        }
//
//        Log.d(TAG, "Starting system drag for position: " + position);
//
//        mIsSystemDragging = true;
//        mCurrentDragView = view;
//        view.setVisibility(View.INVISIBLE);
//
//        DragData dragData = new DragData(mListener.getDataAtPosition(position), SOURCE_INTERNAL, position);
//        View.DragShadowBuilder shadowBuilder = mListener.createDragShadow(view);
//
//        // 创建ClipData
//        ClipData.Item item = new ClipData.Item("drag_" + System.currentTimeMillis());
//        ClipData clipData = new ClipData("DRAG", new String[]{"text/plain"}, item);
//
//        try {
//            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
//                view.startDragAndDrop(clipData, shadowBuilder, dragData, View.DRAG_FLAG_GLOBAL);
//            } else {
//                view.startDrag(clipData, shadowBuilder, dragData, View.DRAG_FLAG_GLOBAL);
//            }
//        } catch (Exception e) {
//            Log.e(TAG, "Start drag failed", e);
//            restoreDragView();
//            mIsSystemDragging = false;
//        }
//    }
//
//    /**
//     * 手动开始拖拽
//     */
//    public void beginDrag(View view, int position) {
//        if (mContainer instanceof RecyclerView) {
//            RecyclerView recyclerView = (RecyclerView) mContainer;
//            RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(position);
//            if (viewHolder != null && mListener.canStartDrag(view, position)) {
//                mItemTouchHelper.startDrag(viewHolder);
//            }
//        } else {
//            startSystemDrag(view, position);
//        }
//    }
//
//    /**
//     * 拖拽监听实现
//     */
//    @Override
//    public boolean onDrag(View v, DragEvent event) {
//        switch (event.getAction()) {
//            case DragEvent.ACTION_DRAG_STARTED:
//                Log.d(TAG, "Drag started");
//                return true;
//
//            case DragEvent.ACTION_DRAG_ENTERED:
//                mContainer.setBackgroundColor(0x20000000);
//                Log.d(TAG, "Drag entered container");
//                return true;
//
//            case DragEvent.ACTION_DRAG_LOCATION:
//                handleDragLocation(event);
//                return true;
//
//            case DragEvent.ACTION_DROP:
//                Log.d(TAG, "Drag drop at position: " + mTargetPosition);
//                return handleDrop(event);
//
//            case DragEvent.ACTION_DRAG_ENDED:
//                handleDragEnd(event);
//                Log.d(TAG, "Drag ended");
//                return true;
//
//            case DragEvent.ACTION_DRAG_EXITED:
//                mContainer.setBackgroundColor(Color.TRANSPARENT);
//                removePlaceholder();
//                Log.d(TAG, "Drag exited container");
//                return true;
//        }
//        return false;
//    }
//
//    /**
//     * 处理拖拽位置更新
//     */
//    private void handleDragLocation(DragEvent event) {
//        DragData dragData = (DragData) event.getLocalState();
//        if (dragData == null) return;
//
//        int newPosition = findPositionUnderPoint(event.getX(), event.getY());
//        if (mTargetPosition != newPosition) {
//            Log.d(TAG, "Drag location changed: " + mTargetPosition + " -> " + newPosition);
//            updatePlaceholderPosition(newPosition, dragData);
//            mTargetPosition = newPosition;
//        }
//    }
//
//    /**
//     * 更新占位符位置
//     */
//    private void updatePlaceholderPosition(int position, DragData dragData) {
//        if (!mListener.shouldShowPlaceholder(dragData)) return;
//
//        removePlaceholder();
//
//        if (position >= 0 && position <= mContainer.getChildCount()) {
//            mPlaceholderView = mListener.createPlaceholderView(mContainer.getContext());
//            if (mPlaceholderView != null) {
//                if (position >= mContainer.getChildCount()) {
//                    mContainer.addView(mPlaceholderView);
//                } else {
//                    mContainer.addView(mPlaceholderView, position);
//                }
//                Log.d(TAG, "Placeholder added at position: " + position);
//            }
//        }
//    }
//
//    /**
//     * 处理拖拽放下
//     */
//    private boolean handleDrop(DragEvent event) {
//        DragData dragData = (DragData) event.getLocalState();
//        if (dragData == null) {
//            Log.w(TAG, "Drop event with null drag data");
//            return false;
//        }
//
//        boolean success = mListener.onDrop(dragData, mTargetPosition, mCurrentDragView);
//        Log.d(TAG, "Drop handled, success: " + success);
//
//        cleanupAfterDrag();
//        return success;
//    }
//
//    /**
//     * 处理拖拽结束
//     */
//    private void handleDragEnd(DragEvent event) {
//        DragData dragData = (DragData) event.getLocalState();
//        if (dragData == null) return;
//
//        boolean success = event.getResult();
//        Log.d(TAG, "Drag ended with result: " + success);
//
//        restoreDragView();
//        mListener.onDragEnd(success, dragData, mCurrentDragView);
//        cleanupAfterDrag();
//        mIsSystemDragging = false;
//    }
//
//    /**
//     * 恢复拖拽视图
//     */
//    private void restoreDragView() {
//        if (mCurrentDragView != null) {
//            mCurrentDragView.setVisibility(View.VISIBLE);
//            Log.d(TAG, "Drag view restored");
//
//            // 刷新RecyclerView确保状态正确
//            if (mContainer instanceof RecyclerView) {
//                RecyclerView.Adapter adapter = ((RecyclerView) mContainer).getAdapter();
//                if (adapter != null) {
//                    adapter.notifyDataSetChanged();
//                }
//            }
//        }
//        mCurrentDragView = null;
//    }
//
//    /**
//     * 清理拖拽状态
//     */
//    private void cleanupAfterDrag() {
//        removePlaceholder();
//        mTargetPosition = -1;
//        mContainer.setBackgroundColor(Color.TRANSPARENT);
//    }
//
//    /**
//     * 移除占位符
//     */
//    private void removePlaceholder() {
//        if (mPlaceholderView != null && mPlaceholderView.getParent() != null) {
//            ((ViewGroup) mPlaceholderView.getParent()).removeView(mPlaceholderView);
//            mPlaceholderView = null;
//            Log.d(TAG, "Placeholder removed");
//        }
//    }
//
//    /**
//     * 停止所有拖拽操作
//     */
//    public void stopDrag() {
//        if (mIsSystemDragging) {
//            cleanupAfterDrag();
//            mIsSystemDragging = false;
//            Log.d(TAG, "Drag stopped manually");
//        }
//        mCurrentViewHolder = null;
//    }
//
//    /**
//     * 检测是否应该切换到系统拖拽
//     */
//    private boolean shouldSwitchToSystemDrag(View view, float dX, float dY) {
//        if (mIsSystemDragging) return false;
//
//        int[] viewLocation = new int[2];
//        view.getLocationOnScreen(viewLocation);
//
//        float centerX = viewLocation[0] + view.getWidth() / 2f + dX;
//        float centerY = viewLocation[1] + view.getHeight() / 2f + dY;
//
//        int[] containerLocation = new int[2];
//        mContainer.getLocationOnScreen(containerLocation);
//
//        int threshold = dpToPx(30);
//        Rect expandedBounds = new Rect(
//                containerLocation[0] - threshold,
//                containerLocation[1] - threshold,
//                containerLocation[0] + mContainer.getWidth() + threshold,
//                containerLocation[1] + mContainer.getHeight() + threshold
//        );
//
//        return !expandedBounds.contains((int) centerX, (int) centerY);
//    }
//
//    /**
//     * 查找触摸点下的子视图
//     */
//    private View findChildUnderPoint(float x, float y) {
//        for (int i = 0; i < mContainer.getChildCount(); i++) {
//            View child = mContainer.getChildAt(i);
//            if (isPointInView(child, x, y)) {
//                return child;
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 查找位置
//     */
//    private int findPositionUnderPoint(float x, float y) {
//        for (int i = 0; i < mContainer.getChildCount(); i++) {
//            if (isPointInView(mContainer.getChildAt(i), x, y)) {
//                return i;
//            }
//        }
//        return mContainer.getChildCount();
//    }
//
//    /**
//     * 判断点是否在视图内
//     */
//    private boolean isPointInView(View view, float x, float y) {
//        int[] location = new int[2];
//        view.getLocationOnScreen(location);
//        int[] parentLocation = new int[2];
//        mContainer.getLocationOnScreen(parentLocation);
//
//        float relativeX = x + parentLocation[0] - location[0];
//        float relativeY = y + parentLocation[1] - location[1];
//
//        return relativeX >= 0 && relativeX <= view.getWidth() &&
//                relativeY >= 0 && relativeY <= view.getHeight();
//    }
//
//    private int dpToPx(int dp) {
//        DisplayMetrics dm = mContainer.getResources().getDisplayMetrics();
//        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, dm);
//    }
//
//    /**
//     * 销毁资源
//     */
//    public void destroy() {
//        stopDrag();
//        removePlaceholder();
//        mContainer.setOnDragListener(null);
//        mContainer.setOnTouchListener(null);
//        Log.d(TAG, "UniversalDragManager destroyed");
//    }
//
//    /**
//     * 获取当前拖拽状态
//     */
//    public boolean isDragging() {
//        return mIsSystemDragging;
//    }
//
//    /**
//     * 获取当前目标位置
//     */
//    public int getTargetPosition() {
//        return mTargetPosition;
//    }
//
//    /**
//     * 拖拽数据包装类
//     * 只包含必要的数据信息，不包含View引用
//     */
//    public class DragData {
//        public final ViewGroup sourceViewGroup;       // 来源类型
//        public final int originalPosition; // 原始位置
//        public final Object data;          // 拖拽的数据
//
//        public DragData(Object data, ViewGroup sourceViewGroup, int originalPosition) {
//            this.data = data;
//            this.sourceViewGroup = sourceViewGroup;
//            this.originalPosition = originalPosition;
//        }
//
//        @Override
//        public String toString() {
//            return "DragData{" +
//                    "sourceViewGroup=" + sourceViewGroup +
//                    ", originalPosition=" + originalPosition +
//                    '}';
//        }
//    }
//
//    /**
//     * 拖拽事件监听器
//     */
//    public interface DragEventListener {
//        /**
//         * 是否可以开始拖拽
//         *
//         * @param view     被拖拽的视图
//         * @param position 视图位置
//         */
//        boolean canStartDrag(View view, int position);
//
//        /**
//         * 创建拖拽阴影
//         *
//         * @param view 被拖拽的视图
//         */
//        View.DragShadowBuilder createDragShadow(View view);
//
//        /**
//         * 处理拖拽放下事件
//         *
//         * @param dragData       拖拽数据
//         * @param targetPosition 目标位置
//         * @param draggedView    拖拽的视图（可能为null）
//         * @return 是否处理成功
//         */
//        boolean onDrop(DragData dragData, int targetPosition, View draggedView);
//
//        /**
//         * 拖拽结束回调
//         *
//         * @param success     是否成功
//         * @param dragData    拖拽数据
//         * @param draggedView 拖拽的视图（可能为null）
//         */
//        void onDragEnd(boolean success, DragData dragData, View draggedView);
//
//        /**
//         * 是否需要显示占位符
//         *
//         * @param dragData 拖拽数据
//         */
//        boolean shouldShowPlaceholder(DragData dragData);
//
//        /**
//         * 创建占位符视图
//         *
//         * @param context 上下文
//         */
//        View createPlaceholderView(Context context);
//
//        /**
//         * 获取指定位置的数据
//         *
//         * @param position 位置
//         * @return 数据对象
//         */
//        Object getDataAtPosition(int position);
//
//        /**
//         * 处理内部移动（用于ItemTouchHelper）
//         *
//         * @param fromPosition 起始位置
//         * @param toPosition   目标位置
//         * @return 是否处理成功
//         */
//        boolean onInternalMove(int fromPosition, int toPosition);
//    }
//}